package io.gitee.cofenghen.jdbctempleplus;


import io.gitee.cofenghen.jdbctempleplus.model.PageResult;
import io.gitee.cofenghen.jdbctempleplus.model.SelectPageMapListSqlModel;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


public abstract class AbstratcJdbcTemplePlusOperations {
    /**
     * 转换
     * @param mappedClass 泛型参数
     * @return 返回泛型
     */
    public  <T> RowMapper<T> convertor(Class<T> mappedClass) {
        return new BeanPropertyRowMapper<>(mappedClass);
    }
    /**
     * SqlParameterSource转换器
     *
     * @param bean 待转换的参数值类型
     * @return BeanPropertySqlParameterSource
     */
    public SqlParameterSource convertor(Object bean) {
        return new BeanPropertySqlParameterSource(bean);
    }

    /**
     * SqlParameterSource转换器
     *
     * @param values 待转换的参数值类型
     * @return MapSqlParameterSource
     */
    public SqlParameterSource convertor(Map<String, ?> values) {
        return new MapSqlParameterSource(values);
    }

    /**
     * 更新数据操作，适用于INSERT、UPDATE、DELETE
     *
     * @param nameSql 命名语法SQL;例如:(UPDATE users SET name = :userName)
     * @param bean    Bean类型的属性名，替换命名语法参数
     * @return 更新数据条数
     */
    public abstract int update(String nameSql, Object bean) throws DataAccessException;

    /**
     * 更新数据操作，适用于INSERT、UPDATE、DELETE
     *
     * @param nameSql  命名语法SQL;例如:(UPDATE users SET name = :userName)
     * @param paramMap Map类型的key，替换命名语法参数
     * @return 更新数据条数
     */
    public abstract int update(String nameSql, Map<String, ?> paramMap) throws DataAccessException;

    /**
     * 更新数据操作，适用于INSERT、UPDATE、DELETE
     *
     * @param sql  占位符语法SQL;例如:(UPDATE users SET name = ?)
     * @param args 数组类型，替换占位符参数
     * @return 更新数据条数
     */
    public abstract int commonUpdate(String sql, Object... args) throws DataAccessException;


//    protected abstract<T> T selectObject2(String nameSql, Map<String, ?> paramMap, Class<T> requiredType) throws DataAccessException;

    /**
     * 获取第一行第一列
     *
     * @param nameSql      命名语法SQL;例如:(SELECT name FROM users WHERE name = :userName, age = :age)
     * @param paramMap     Map类型的key，替换命名参数
     * @param requiredType 返回的Bean类型
     * @return 唯一的结果，Bean类型为requiredType
     */
    public abstract <T> T selectColumn00(String nameSql, Map<String, ?> paramMap, Class<T> requiredType) throws DataAccessException;


    /**
     * 获取第一行 ，存在多笔结果抛出异常
     * @param nameSql
     * @param paramMap
     * @param requiredType
     * @param <T>
     * @return
     */
    public abstract <T> T selectOne(String nameSql, Map<String, ?> paramMap, Class<T> requiredType);

    /**
     * 获取第一行 ，存在多笔结果抛出异常
     * @param nameSql
     * @param paramMap
     * @return
     */
    public abstract Map<String, Object>   selectOne(String nameSql, Map<String, ?> paramMap);
    /**
     * 查询匹配条件的唯一一条数据
     *
     * @param nameSql      命名语法SQL;例如:(SELECT * FROM users WHERE name = :userName, age = :age)
     * @param bean         Bean类型的属性名，替换命名参数
     * @param requiredType 返回的Bean类型
     * @return 唯一的结果，Bean类型为requiredType
     */
    public abstract <T> T selectObject(String nameSql, Object bean, Class<T> requiredType) throws DataAccessException;

    /**
     * 查询匹配条件的唯一一条数据
     *
     * @param nameSql  命名语法SQL;例如:(SELECT * FROM users WHERE name = :userName, age = :age)
     * @param paramMap Map类型的key，替换命名参数
     * @return 唯一的Map类型结果
     */
    public abstract Map<String, Object> selectMap(String nameSql, Map<String, ?> paramMap) throws DataAccessException;


    /**
     * 查询匹配条件的唯一一条数据
     *
     * @param nameSql 命名语法SQL;例如:(SELECT * FROM users WHERE name = :userName, age = :age)
     * @param bean    Bean类型的属性名，替换命名参数
     * @return 唯一的Map类型结果
     */
    public abstract Map<String, Object> selectMap(String nameSql, Object bean) throws DataAccessException;

    /**
     * 查询匹配条件的所有数据
     *
     * @param nameSql  命名语法SQL;例如:(SELECT * FROM users WHERE name = :userName, age = :age)
     * @param paramMap Map类型的key，替换命名参数
     * @return 包含Map的List结果列表
     */
    public abstract List<Map<String, Object>> select(String nameSql, Map<String, ?> paramMap) throws DataAccessException;


    /**
     * 查询匹配条件的所有数据
     *
     * @param nameSql 命名语法SQL;例如:(SELECT * FROM users WHERE name = :userName, age = :age)
     * @param bean    Bean类型的属性名，替换命名参数
     * @return 包含Map的List结果列表
     */
    public abstract List<Map<String, Object>> select(String nameSql, Object bean) throws DataAccessException;

    /**
     * 查询所有数据
     *
     * @param nameSql     命名语法SQL;例如:(SELECT * FROM users)
     * @param mappedClass 返回的class类型
     * @return mappedClass类型的List结果列表
     */
    public abstract <T> List<T> select(String nameSql, Class<T> mappedClass) throws DataAccessException;


    /**
     * 查询所有数据
     *
     * @param nameSql     命名语法SQL;例如:(SELECT * FROM users)
     * @param mappedClass 返回的class类型
     * @return mappedClass类型的List结果列表
     */
    public abstract <T> List<T> select(String nameSql, Map<String, ?> paramMap,Class<T> mappedClass) throws DataAccessException;


    /**
     * 查询分页
     * @param sql_table
     * @param sql_column
     * @param sql_where
     * @param paramMap
     * @param pk_Filed
     * @param orderField
     * @param orderType
     * @param defaultOrderFieldMap
     * @param pageIndex
     * @param pageSize
     * @param sql_column_top
     * @param mappedClass
     * @param <T>
     * @return
     * @throws DataAccessException
     */
    public abstract <T> PageResult<T> selectPageList(String sql_table, String sql_column, String sql_where, Map<String,Object> paramMap, String pk_Filed, String orderField, String orderType, LinkedHashMap<String,String> defaultOrderFieldMap, int pageIndex, int pageSize, String sql_column_top, Class<T> mappedClass);
    public abstract <T> PageResult<T> selectPageList(String sql_table, String sql_column, String sql_where, Map<String,Object> paramMap, String pk_Filed, String orderField, String orderType, LinkedHashMap<String,String> defaultOrderFieldMap, int pageIndex, int pageSize, String sql_column_top, Class<T> mappedClass,boolean selectCount);
    public abstract   PageResult<Map<String, Object>> selectPageMapList(String sql_table, String sql_column, String sql_where, Map<String, Object> paramMap, String pk_Filed, String orderField, String orderType, LinkedHashMap<String, String> defaultOrderFieldMap, int pageIndex, int pageSize, String sql_column_top) ;


    public  abstract SelectPageMapListSqlModel selectPageMapListSql(String sql_table, String sql_column, String sql_where, Map<String, Object> paramMap, String pk_Filed, String orderField, String orderType, LinkedHashMap<String, String> defaultOrderFieldMap, int pageIndex, int pageSize, String sql_column_top, boolean selectCount);
    public abstract   PageResult<Map<String, Object>> selectPageMapList(String sql_table, String sql_column, String sql_where, Map<String, Object> paramMap, String pk_Filed, String orderField, String orderType, LinkedHashMap<String, String> defaultOrderFieldMap, int pageIndex, int pageSize, String sql_column_top,boolean selectCount) throws DataAccessException;


    /**
     * 查询匹配条件的唯一一条数据
     *
     * @param sql          占位符语法SQL;例如:(SELECT * FROM users WHERE name = ?, age = ?)
     * @param requiredType 返回的Bean类型
     * @param args         数组类型，替换占位符参数
     * @return 唯一的结果，Bean类型为requiredType
     */
    public abstract <T> T commonSelectCloumn00(String sql, Class<T> requiredType, Object... args) throws DataAccessException;

    /**
     * 查询匹配条件的唯一一条数据
     *
     * @param sql  占位符语法SQL;例如:(SELECT * FROM users WHERE name = ?, age = ?)
     * @param args 数组类型，替换占位符参数
     * @return 唯一的Map类型结果
     */
    public abstract Map<String, Object> commonSelectMap(String sql, Object... args) throws DataAccessException;

    /**
     * 查询匹配条件的所有数据
     *
     * @param sql  占位符语法SQL;例如:(SELECT * FROM users WHERE name = ?, age = ?)
     * @param args 数组类型，替换占位符参数
     * @return 包含Map的List结果列表
     */
    public abstract List<Map<String, Object>> commonSelect(String sql, Object... args) throws DataAccessException;

    /**
     * 查询所有数据
     *
     * @param sql         占位符语法SQL;例如:(SELECT * FROM users)
     * @param mappedClass 返回的class类型
     * @return mappedClass类型的List结果列表
     */
    public abstract <T> List<T> commonSelect(String sql, Class<T> mappedClass) throws DataAccessException;

    /**
     *
     * @param sql 占位符语法SQL；例如：(SELECT * FROM users WHERE username = ?)
     * @param rowMapper 数据库字段和BEAN字段不一致时的映射
     * @param args 条件参数
     * @param <T>
     * @return <T> List<T> 返回list结果集
     * @throws DataAccessException
     */
    public abstract <T> List<T> commonSelect(String sql, RowMapper<T> rowMapper, Object... args) throws DataAccessException;

    /**
     *
     * @param sql 占位符语法SQL；例如：（SELECT COUNT(*) FROM users  WHERE = ?）
     * @param requiredType 返回值类型
     * @param args 条件参数
     * @param <T>
     * @return <T>T 返回值
     * @throws DataAccessException
     */
    public abstract <T> T selectObject(String sql, Class<T> requiredType, Object... args) throws DataAccessException;




}
